package NetWork;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
//高并发就是指的客户请求太多，服务器忙不过来了
//分布式就是管多台机器
//对于网络编程来说，会有客户端发送请求，然后服务器要计算响应，再发给服务器
//那网络通信要有一个“中间人”来接受和发送数据，为socket，让后，再客户端给中间人发送数据是，是通过一个介质来发送的
//为一个DatagramPacket。类似与阻塞队列把
public class UdpServer {

    //所以对与服务器我们一定要给客户端创建一个中间人

    public DatagramSocket socket = null;  //服务器和客户端都要创建socket

    //创建服务器的同时手动分配一个端口，服务器要绑定一个端口，让操作系统分配一个端口号，服务器的端口号不能为随机的，不能每次的端口都不一样
    //port为端口号  ，其实IP和端口可以理解为包含的关系，IP包含端口，为餐厅和窗口，市和区
   public UdpServer(int port) throws SocketException {  //构建服务器的时候要创建一个端口号，这样用户才能找到你，给你发送信息，那中间人也得知道你的端口号
         socket = new DatagramSocket(port);        //所以再构造方法里就把端口号告诉socket“中间人”
   }  //这样中间人就创建好了,这样就可以往里卖弄放数据了

   public void start() throws IOException {
       while (true) {//数据报
           DatagramPacket request = new DatagramPacket(new byte[4096], 4096);  //它的数据来源与网卡
           //DatagramPacket 这个就相当于把数据包装一下
           //类似与阻塞队列，管道一样的东西，介质
           //这个管道为啥不先接受客户端的请求，现在不是空的吗?
          //这里需要解决一下问题
           //中间人接受来自客户端发送给管道的东西
           //直接自动就给了服务器，这里不需要我们再放到管道
           //因为我们不是开始的时候就告诉中间人端口号了嘛，所以它一接受到请求那么就自动给服务器发过去了
           socket.receive(request);
           //如果socker 接受请求的时候没有请求，会阻塞


           //此时得到了请求，那服务器就的得到请求是啥，，所以通过一个字符串得到请求，看看是啥
           String s1 = new String(request.getData(), 0, request.getLength()); //这个getLength不一定是定义的长度，而是收到数据的真实长度
           //这个String的构造函数的意思：得到数组，然后长度是从0下标到得到的长度下标，把这个区间的字节连成一个字符串

           //计算请求
           String pocess = coclulate(s1);

           //计算完了，就需要再放到给服务器管道
         //  先把这个数据包装好，数据报就得有客户端得ip和端口号
           //pocess.getBytes(), pocess.getBytes().length这两个代表的是数据内容那些
           DatagramPacket xiangying = new DatagramPacket(pocess.getBytes(), pocess.getBytes().length, request.getSocketAddress());
           //这里就需要把客户端的ip和端口号先告诉socket；
           socket.send(xiangying);  //代表服务器把数据发送过去了
           System.out.printf("[%s:%d]  res=%s   rep=%s",request.getSocketAddress(),request.getPort(),s1,pocess);
           //通过传统的输出即可
       }
   }

   public String coclulate(String s1){
       return s1;
   }//进行计算响应的

    public static void main(String[] args) throws IOException {
        UdpServer server = new UdpServer(9090);
        server.start();  //此时因为没有请求，所以处于阻塞状态
    }


}
